#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
重试失败的仓库，并合并结果到已有的Excel报告中
"""

import sys
from pathlib import Path

# 导入usage_analyzer
sys.path.insert(0, str(Path(__file__).parent))
from usage_analyzer import UsageAnalyzer

try:
    import pandas as pd
    HAS_EXCEL = True
except ImportError:
    HAS_EXCEL = False


def main():
    """重试失败的仓库"""
    project_root = Path(__file__).parent.parent.parent
    
    # 原始报告
    original_report = project_root / 'output' / 'usage_scenario_a.xlsx'
    
    # 重试配置
    abi_dir = project_root / 'output' / 'analyzed'
    retry_repos = project_root / 'config' / 'repos_scenario_a_retry.txt'
    retry_output = project_root / 'output' / 'usage_scenario_a_retry.xlsx'
    cache_dir = project_root / 'data' / 'repos'
    
    print("=" * 80)
    print("重试失败的仓库")
    print("=" * 80)
    
    # 分析失败的仓库
    analyzer = UsageAnalyzer(str(abi_dir), str(retry_repos), str(cache_dir))
    analyzer.analyze_repos()
    analyzer.generate_report(str(retry_output))
    
    # 合并结果
    print("\n" + "=" * 80)
    print("合并分析结果")
    print("=" * 80)
    
    if not HAS_EXCEL:
        print("[ERROR] 需要安装pandas")
        return 1
    
    # 读取原始报告
    df_original = pd.read_excel(original_report, sheet_name='按使用频度')
    print(f"[INFO] 原始报告: {len(df_original)} 个函数")
    
    # 读取重试报告
    df_retry = pd.read_excel(retry_output, sheet_name='按使用频度')
    print(f"[INFO] 重试报告: {len(df_retry)} 个函数")
    
    # 合并使用次数（按函数名）
    merged_data = {}
    
    # 先添加原始数据
    for _, row in df_original.iterrows():
        func_name = row['函数名']
        merged_data[func_name] = {
            '函数名': func_name,
            '库': row['库'],
            '命名空间': row['命名空间'],
            '类': row['类'],
            '完整签名': row['完整签名'],
            '使用次数': row['使用次数'],
            '使用仓库数': row['使用仓库数'],
            '使用文件数': row['使用文件数'],
            '使用仓库': row['使用仓库']
        }
    
    # 合并重试数据
    for _, row in df_retry.iterrows():
        func_name = row['函数名']
        if func_name in merged_data:
            # 累加使用次数
            merged_data[func_name]['使用次数'] += row['使用次数']
            merged_data[func_name]['使用仓库数'] += row['使用仓库数']
            merged_data[func_name]['使用文件数'] += row['使用文件数']
            # 合并仓库列表
            repos_str = merged_data[func_name]['使用仓库']
            repos = set(repos_str.split(', ')) if repos_str and isinstance(repos_str, str) else set()
            new_repos_str = row['使用仓库']
            new_repos = set(new_repos_str.split(', ')) if new_repos_str and isinstance(new_repos_str, str) else set()
            merged_data[func_name]['使用仓库'] = ', '.join(sorted(repos | new_repos))[:100]
    
    # 生成合并后的DataFrame
    df_merged = pd.DataFrame(list(merged_data.values()))
    df_merged = df_merged.sort_values('使用次数', ascending=False)
    
    # 保存合并报告
    merged_output = project_root / 'output' / 'usage_scenario_a_merged.xlsx'
    
    with pd.ExcelWriter(merged_output, engine='openpyxl') as writer:
        # Sheet 1: 按使用频度排序
        df_merged.to_excel(writer, sheet_name='按使用频度', index=False)
        
        # Sheet 2: Top 100
        df_merged.head(100).to_excel(writer, sheet_name='Top100高频函数', index=False)
        
        # Sheet 3: Top 500
        df_merged.head(500).to_excel(writer, sheet_name='Top500高频函数', index=False)
        
        # Sheet 4: 未使用
        df_unused = df_merged[df_merged['使用次数'] == 0].sort_values('库')
        df_unused.to_excel(writer, sheet_name='未使用函数', index=False)
    
    print(f"[SUCCESS] 合并报告已生成: {merged_output}")
    
    # 打印对比
    print("\n" + "=" * 80)
    print("合并前后对比")
    print("=" * 80)
    print(f"原始被使用函数: {len(df_original[df_original['使用次数'] > 0])}")
    print(f"重试新增使用函数: {len(df_retry[df_retry['使用次数'] > 0])}")
    print(f"合并后被使用函数: {len(df_merged[df_merged['使用次数'] > 0])}")
    print(f"原始总调用次数: {df_original['使用次数'].sum()}")
    print(f"重试新增调用次数: {df_retry['使用次数'].sum()}")
    print(f"合并后总调用次数: {df_merged['使用次数'].sum()}")
    print("=" * 80)
    
    return 0


if __name__ == '__main__':
    try:
        sys.exit(main())
    except Exception as e:
        print(f"[ERROR] 重试失败: {e}", file=sys.stderr)
        import traceback
        traceback.print_exc()
        sys.exit(1)

